IPC
프로세스 간 통신에 필요한 IPC에 대해 학습한 내용입니다.
Interprocess Communication(IPC)
→ Process들은 독립적인 수행을 하는 프로세스와 다른 프로세스와 협력을 하여 수행을 하는 프로세스들로 나뉘어집니다. 이때 협력을 하는 cooperating process들은 서로 간의 통신을 필요로 하고 IPC가 이를 지원해주는 역할을 합니다.
Type
(1) Shared Memory
▲ Shared Memory
- 프로세스 간 사전에 지정된 메모리 공간을 통해 데이터를 공유하는 방식입니다.
- 이때, 데이터를 저장하는 공간, 즉, 공유 메모리가 kernel에 위치하지 않고 user의 address space에 위치합니다. 그렇기 때문에 OS의 영향을 받지 않습니다.
- Application programmer가 직접 shared memory를 지정해줍니다.
- 공유된 메모리에 동시에 접근해선 안됩니다. → 동기화 문제(Synchronization, 이는 후에 자세히 다루겠습니다.)
(2) Message Passing
▲ Message Passing
- Kernel을 경유하기 때문에 OS가 관여합니다.
- 프로세스 간 공유된 message queue를 통해 데이터를 교류합니다.
- 필요한 연산자에는 send(), recieve() 연산을 사용합니다.
- 고정된 message 크기와 가변적인 message 크기로 분류될 수 있습니다.
- fixed message
- 시스템 구현이 쉽습니다.
- 하지만 user가 사용하기에 어려움이 있습니다.
- variable message
- 시스템적 구현이 힘듭니다.
- 하지만 user가 사용하기에 용이합니다.
- fixed message
(3) Message Passing과 Shared Memory 비교
- Message Passing은 적은 양의 Data 공유에 용이합니다.
- 충돌에 대한 걱정이 없고 Shared memory보다 분리된 process에 대해 구현이 쉽습니다.
- 단, Kernel을 경유하여 전송해야 하기 때문에 System call로 이루어져있어 초기 단계에서만 system call을 사용하고 이후 프로세스에 바로 접근이 가능한 Shared memory에 비해 느립니다.
(4) Commuication Link
- Physical
- Shared Memory
- Hardware bus
- Network
- Loigical
- Direct & Indirect
- Synchronous & Asynchronous
- Automatic & Explicit buffering
Direct or Indirect
Direct communication
- sender와 reciever를 명시해줘야 합니다. ( Symmetry )
- send (P, message) → P에게 message를 전송
- receive (Q, message) → Q로부터 message를 받음
- sender만 recipient(수취인)을 명시해도 됩니다. (Asymmetry)
- send (P, message) → P에게 message를 전송
- receive (id, message) → 아무 process에게나 message를 받습니다. id는 통신이 발생한 process의 ID 입니다.
- 서로의 신원을 알고 있어야합니다.
- 두 프로세스 사이에 하나의 Link가 있어야합니다.
- 하나의 Link는 무조건 두 개의 process와 연결되어야 합니다.
- 단방향일 수 있고, 쌍방향일 수 있습니다.
-
모듈성이 부족하다는 단점이 있습니다.
⇒ 집단과 집단 연결에 용이하지 못한다는 뜻입니다.
Indirect communication
- 대부분 이 방식을 채택합니다.
- message를 프로세스 간 직접 주고 받지않고, mailbox를 통해 주고 받습니다.
- send(A, message) - mailbox A에 message를 전송
- receive(A, message) - mailbox A에서 message를 수신
- mailbox를 port라고 하고 해당 mailbox가 갖는 고유 identification을 portnumber라고 합니다.
- 하나의 link가 한 쌍의 프로세스 사이에 존재합니다.
- 하나의 link가 두 개 이상의 프로세스들과 연결될 수 있습니다.
- 각 프로세스들 사이에 다른 개수의 link가 존재할 수 있습니다.
- 단방향, 쌍방향 모두 구현 가능합니다.
- Issue: Mailbox에 message가 도착하면 누가 받는 것일까?
- solutions
-
하나의 link에 최대 2개의 process만 연결하는 방법
→ 이렇게 되면 sender 말고는 receiver니까 수신자가 명확해집니다.
- 한번에 하나의 프로세스만 receive()를 사용하는 방법
-
system이 임의로 receiver를 선정하는 방법
→ 단, 이 경우 sender에게 receiver가 누군지 명시해줘야합니다.)
-
- solutions
Synchronous or Asynchronous
→ Blocking or Non-blocking 이라고도 합니다.
Blocking
- Send : receiver가 mailbox에서 message를 받아갈 때까지 block 됩니다.
- Receive : message가 올때까지 receiver는 block 됩니다.
Non-blocking
- Send : sender는 message를 보내면 다시 일을 재개합니다.
- Receive : message가 있든 없든 수신합니다. ( message가 없는 경우 null을 받아갑니다. )
Buffering
- zero capacity → receiver가 message를 받을 때까지 sender는 대기 상태입니다.
- Bounded capacity → mailbox 크기가 정해지고 full인 상태일 때 sender는 더이상 message를 보낼 수 없고 대기 상태가 됩니다.
- Unbounded capacity → mailbox의 크기가 무한하며 sender는 계속해서 message를 보낼 수 있습니다.
⇒ zero capacity를 ‘no buffering’이라고 하고, Bounded 와 Unbounded를 ‘automatically buffering’ 이라고 말합니다.
Communication in Client-Server Systems
Signal
- 대표적인 비동기적 기능 (IPC) → A가 B에게 신호를 보내도 B가 scheduled in 되기 전까지 받지 못합니다.
- 프로그램을 멈추거나 종료시키는 용도로 사용됩니다.
- Process는 signal 도착 시 4개의 선택지를 가집니다.
- Ignore - SIGSTOP, SIGKILL로 무시합니다.
- Block - BLOCK하고 나중에 진행합니다.
- Handle - SIGNAL HANDLER로 즉시 실행합니다.
- Allow kernel to handle it
Pipe
→ 초기 UNIX에 사용된 최초의 IPC 구조로 두 프로세스 간 전달자 역할을 수행합니다.
(1) Pipe의 issue들
- 양방향 인가, 단방향 인가?
- 두 개의 통신이 있다면, 그것은 half duplex인가, full duplex 인가?
- half duplex → 동시에 한 방향만 가능
- full duplex - > 동시에 양 방향 가능
- 통신하는 프로세스 간 관계가 Parent - Child 구조 인가?
- 다른 Network와도 통신이 되는가, 아니면 같은 machine에서만 통신이 가능한가?
(2) Type
- Ordinary Pipe
- Producer-Consumer 방식 표준을 통신에 사용합니다.
- Producer는 pipe의 끝에 write
- Consumer는 pipe의 끝에서 read
- 단방향(Unidirectional) 통신입니다.
- fd[0]와 fd[1]를 사용하여 통신합니다.
- fd[0] : read end of pipe
- fd[1] : write end of pipe
- Parent와 Child관계를 필요로 하며, 이는 동일한 Machine에서만 가능한 것과 같은 말입니다.
- Producer-Consumer 방식 표준을 통신에 사용합니다.
- Named Pipe
- 좀 더 좋은 통신 tool이라고 볼 수 있습니다.
- 쌍방향 통신이 가능하며 Parent-child 구조를 필요로 하지 않습니다.
- 한 번 생성이 되면 몇몇 프로세스들이 통신을 위해 사용 가능합니다.
- 통신이 끝나고도 존재 가능합니다. → delete 시 종료
- UNIX에서 FIFO로 불립니다.
- open(), read(), write(), close()로 사용
Socket
→ Client-Server 구조에 사용됩니다.
(1) 정의
- End point for communication
- Bound to a port
(2) 특징
- Port를 이용하여 통신에 사용됩니다.
Port?
→ OS가 제공하는 추상화로 이를 이용하여 통신하려는 상대 Process를 찾아갑니다. 자세히 말하자면 상대 Process의 Socket을 찾아갑니다.
- 다른 IPC와 달리 위치에 독립적입니다. 다른 machine 간에도 통신이 가능합니다.
- 연결의 Semantics를 정할 수 있습니다.
- Reliable : TCP ( connection-oriented )
- Unreliable : UDP ( connectionless )